// 改变data的时候需要知道 什么时候修改了 触发getter 和 setter
// observer 用于给data中所有的数据添加getter和setter
// 方便我们在获取或者设置data中数据的时候，实现我们的逻辑 10:12
class Observe {
  constructor(data){
    this.data = data
    this.walk(data)
  }
  /**
   * 核心方法 遍历data中所有的数据 都添加上getter和setter
   */
  walk(data){
    
    if(!data) {
      return 
    }
    if(typeof data != 'object'){
      return 
    }
    Object.keys(data).forEach(key=>{
      //给data中的key设置getter 和 setter
      this.defineReactive(data,key,data[key])
      //如果data[key] 是个对象 那么递归 如果是基本数据类型 前面就会return
      this.walk(data[key])
    })

  }
  //定义响应式的数据 数据劫持
  defineReactive(obj,key,value){
    let that = this
    // data中的每一个数据都应该维护一个dep对象
    // dep保存了所有的订阅了该数据的订阅者 每个key 都有 dep对象

    let dep = new Dep();
    Object.defineProperty(obj,key,{
      enumerable:true,
      configurable:true,
      get(){
        console.log('你获取了值')
        Dep.target && dep.addSub(Dep.target);
        return value
      },
      set(newValue) {
        if(value === newValue) {return}
        value = newValue
        console.log('你设置了值',newValue)
        //如果newValue 也是一个object
        that.walk(newValue);
        // 修改值的时候要通知订阅者更新内容
        dep.notfiy();
      }
    })
  }
}
